--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Commit 828488e6e58a504872ab995aad6806dde37d727b
Parents : 231739b
Author : Ivan <ivan@quad4.io>
Signature : Invalid signer <e46112d44649266d71fe2193e00a4710>, author is <ivan@quad4.io>
Date : 2026-07-08T10:44:24-05:00
fix(MapPage): improve URL validation with abort controller timeout handling to prevent hanging requests
Changes
1 files changed, 6 insertions(+), 2 deletions(-)
Diff
diff --git a/meshchatx/src/frontend/components/map/MapPage.vue b/meshchatx/src/frontend/components/map/MapPage.vue
index 3e9ffc89..e5f839fd 100644
--- a/meshchatx/src/frontend/components/map/MapPage.vue
+++ b/meshchatx/src/frontend/components/map/MapPage.vue
@@ -2260,13 +2260,14 @@ export default {
if (!url || this.isLocalUrl(url)) {
return true;
}
+ let timeoutId = null;
try {
let testUrl = url.endsWith("/") ? url.slice(0, -1) : url;
if (testUrl.includes("{z}") || testUrl.includes("{x}") || testUrl.includes("{y}")) {
testUrl = testUrl.replace("{z}", "0").replace("{x}", "0").replace("{y}", "0");
}
const controller = new AbortController();
- const timeoutId = setTimeout(() => controller.abort(), 8000);
+ timeoutId = setTimeout(() => controller.abort(), 8000);
const response = await fetch(testUrl, {
method: "HEAD",
signal: controller.signal,
@@ -2274,10 +2275,13 @@ export default {
"User-Agent": "ReticulumMeshChatX/1.0",
},
});
- clearTimeout(timeoutId);
return response.ok || response.status === 405 || response.status === 404;
} catch {
return false;
+ } finally {
+ if (timeoutId != null) {
+ clearTimeout(timeoutId);
+ }
}
},
isOpenFreeMapStyleUrl(url) {
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────